home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2007 September / PCWSEP07.iso / Software / Linux / Linux Mint 3.0 Light / LinuxMint-3.0-Light.iso / casper / filesystem.squashfs / usr / share / hal / device-manager / DeviceManager.pyc (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2007-05-11  |  16.6 KB  |  470 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.5)
  3.  
  4. '''This file contains the DeviceManager class.'''
  5. import LaunchpadIntegration
  6. import sys
  7. import gobject
  8. import gtk
  9. import dbus
  10. if getattr(dbus, 'version', (0, 0, 0)) >= (0, 41, 0):
  11.     import dbus.glib as dbus
  12.  
  13.  
  14. try:
  15.     import gnome.ui as gnome
  16. except ImportError:
  17.     gnome_imported = 0
  18.  
  19. gnome_imported = 1
  20. import Const
  21. from Representation import Representation
  22. from Device import Device
  23. from LibGladeApplication import LibGladeApplication
  24.  
  25. class DeviceManager(LibGladeApplication):
  26.     '''This is the main window for the application.'''
  27.     
  28.     def on_about_activate(self, w):
  29.         '''Show the about dialog.'''
  30.         
  31.         try:
  32.             self.about.destroy()
  33.         finally:
  34.             self.about = gnome.ui.About(Const.NAME_LONG, Const.VERSION, Const.COPYRIGHT, Const.INFO, Const.AUTHORS).show()
  35.             self.about.show()
  36.  
  37.  
  38.     
  39.     def on_virtual_devices_activate(self, obj):
  40.         self.dont_show_virtual = 1 - self.dont_show_virtual
  41.         self.update_device_list()
  42.  
  43.     
  44.     def __init__(self):
  45.         '''Init the GUI and connect to the HAL daemon.'''
  46.         LibGladeApplication.__init__(self, Const.DATADIR + '/hal-device-manager.glade')
  47.         LaunchpadIntegration.set_sourcepackagename('hal')
  48.         widget = self.xml.get_widget('help1_menu')
  49.         print widget
  50.         LaunchpadIntegration.add_items(widget, -1, False, True)
  51.         ver = getattr(dbus, 'version', (0, 0, 0))
  52.         if ver < (0, 40, 0):
  53.             dialog = gtk.MessageDialog(None, gtk.DIALOG_MODAL, gtk.MESSAGE_ERROR, gtk.BUTTONS_CLOSE, 'The DBus Python Bindings you are using are too old. Make sure you have the latest version!')
  54.             dialog.run()
  55.             sys.exit(1)
  56.         
  57.         if not gnome_imported:
  58.             self.xml.get_widget('about1').set_sensitive(0)
  59.         
  60.         self.representation = Representation()
  61.         self.bus = dbus.SystemBus()
  62.         self.hal_manager_obj = self.bus.get_object('org.freedesktop.Hal', '/org/freedesktop/Hal/Manager')
  63.         self.hal_manager = dbus.Interface(self.hal_manager_obj, 'org.freedesktop.Hal.Manager')
  64.         self.hal_manager.connect_to_signal(('DeviceAdded',), (lambda : self.gdl_changed('DeviceAdded', *args)))
  65.         self.hal_manager.connect_to_signal(('DeviceRemoved',), (lambda : self.gdl_changed('DeviceRemoved', *args)))
  66.         self.hal_manager.connect_to_signal(('NewCapability',), (lambda : self.gdl_changed('NewCapability', *args)))
  67.         
  68.         try:
  69.             device_names = self.hal_manager.GetAllDevices()
  70.         except:
  71.             dialog = gtk.MessageDialog(None, gtk.DIALOG_MODAL, gtk.MESSAGE_ERROR, gtk.BUTTONS_CLOSE, 'Could not get device list. Make sure hald is running!')
  72.             dialog.run()
  73.             sys.exit(1)
  74.  
  75.         for name in device_names:
  76.             self.add_device_signal_recv(name)
  77.         
  78.         self.dont_show_virtual = 1
  79.         self.update_device_list()
  80.         self.main_window.show()
  81.  
  82.     
  83.     def add_device_signal_recv(self, udi):
  84.         (None, self.bus.add_signal_receiver)((lambda : self.property_modified(udi, *args)), 'PropertyModified', 'org.freedesktop.Hal.Device', 'org.freedesktop.Hal', udi)
  85.  
  86.     
  87.     def remove_device_signal_recv(self, udi):
  88.         
  89.         try:
  90.             self.bus.remove_signal_receiver(None, 'PropertyModified', 'org.freedesktop.Hal.Device', 'org.freedesktop.Hal', udi)
  91.         except Exception:
  92.             e = None
  93.             print 'Older versions of the D-BUS bindings have an error when removing signals. Please upgrade.'
  94.             print e
  95.  
  96.  
  97.     
  98.     def get_current_focus_udi(self):
  99.         '''Get the UDI of the currently focused device'''
  100.         (tree_model, tree_iter) = self.tree_selection.get_selected()
  101.         if tree_iter:
  102.             device_udi = tree_model.get_value(tree_iter, Const.UDI_COLUMN)
  103.             return device_udi
  104.         
  105.  
  106.     
  107.     def on_device_tree_selection_changed(self, tree_selection):
  108.         '''This method is called when the selection has changed in the
  109.         device tree'''
  110.         device_udi = self.get_current_focus_udi()
  111.         if device_udi != None:
  112.             device = self.udi_to_device(device_udi)
  113.             self.update_device_notebook(device)
  114.         
  115.  
  116.     
  117.     def device_condition(self, device_udi, condition_name, condition_details):
  118.         '''This method is called when signals on the Device interface is
  119.         received'''
  120.         print '\nCondition device=%s' % device_udi
  121.         print "  (condition_name, condition_details) = ('%s', '%s')" % (condition_name, condition_details)
  122.  
  123.     
  124.     def property_modified(self, device_udi, num_changes, change_list):
  125.         '''This method is called when signals on the Device interface is
  126.         received'''
  127.         print '\nPropertyModified, device=%s' % device_udi
  128.         for i in change_list:
  129.             property_name = i[0]
  130.             removed = i[1]
  131.             added = i[2]
  132.             print '  key=%s, rem=%d, add=%d' % (property_name, removed, added)
  133.             if property_name == 'info.parent':
  134.                 self.update_device_list()
  135.                 continue
  136.             device_udi_obj = self.bus.get_object('org.freedesktop.Hal', device_udi)
  137.             device_obj = self.udi_to_device(device_udi)
  138.             if device_udi_obj.PropertyExists(property_name, dbus_interface = 'org.freedesktop.Hal.Device'):
  139.                 device_obj.properties[property_name] = device_udi_obj.GetProperty(property_name, dbus_interface = 'org.freedesktop.Hal.Device')
  140.                 print '  value=%s' % device_obj.properties[property_name]
  141.             elif device_obj != None:
  142.                 
  143.                 try:
  144.                     del device_obj.properties[property_name]
  145.  
  146.             
  147.             device_focus_udi = self.get_current_focus_udi()
  148.             if device_focus_udi != None:
  149.                 device = self.udi_to_device(device_udi)
  150.                 if device_focus_udi == device_udi:
  151.                     self.update_device_notebook(device)
  152.                 
  153.             device_focus_udi == device_udi
  154.         
  155.  
  156.     
  157.     def gdl_changed(self, signal_name, device_udi, *args):
  158.         '''This method is called when a HAL device is added or removed.'''
  159.         if signal_name == 'DeviceAdded':
  160.             print '\nDeviceAdded, udi=%s' % device_udi
  161.             self.add_device_signal_recv(device_udi)
  162.             self.update_device_list()
  163.         elif signal_name == 'DeviceRemoved':
  164.             print '\nDeviceRemoved, udi=%s' % device_udi
  165.             self.remove_device_signal_recv(device_udi)
  166.             self.update_device_list()
  167.         elif signal_name == 'NewCapability':
  168.             (cap,) = args
  169.             print '\nNewCapability, cap=%s, udi=%s' % (cap, device_udi)
  170.         else:
  171.             print '*** Unknown signal %s' % signal_name
  172.  
  173.     
  174.     def update_device_list(self):
  175.         '''Builds, or rebuilds, the device tree'''
  176.         self.virtual_root = self.build_device_tree()
  177.         
  178.         try:
  179.             if self.tree_model:
  180.                 pass
  181.         except:
  182.             self.tree_model = gtk.TreeStore(gtk.gdk.Pixbuf, gobject.TYPE_STRING, gobject.TYPE_STRING)
  183.  
  184.         while None:
  185.             it = self.tree_model.get_iter_first()
  186.             if not it:
  187.                 break
  188.             
  189.             continue
  190.             self.virtual_root.populate_gtk_tree(self.tree_model, self.dont_show_virtual, self.representation)
  191.             tree_view = self.xml.get_widget('device_tree')
  192.             
  193.             try:
  194.                 if self.tree_selection:
  195.                     pass
  196.             except:
  197.                 self.tree_selection = tree_view.get_selection()
  198.                 self.tree_selection.connect('changed', self.on_device_tree_selection_changed)
  199.  
  200.             
  201.             try:
  202.                 if self.column_dt:
  203.                     pass
  204.             except:
  205.                 self.column_dt = gtk.TreeViewColumn()
  206.                 self.column_dt.set_title('Devices')
  207.                 render_pixbuf = gtk.CellRendererPixbuf()
  208.                 self.column_dt.pack_start(render_pixbuf, expand = False)
  209.                 self.column_dt.add_attribute(render_pixbuf, 'pixbuf', Const.PIXBUF_COLUMN)
  210.                 render_text = gtk.CellRendererText()
  211.                 self.column_dt.pack_start(render_text, expand = True)
  212.                 self.column_dt.add_attribute(render_text, 'text', Const.TITLE_COLUMN)
  213.                 tree_view.append_column(self.column_dt)
  214.  
  215.             tree_view.set_model(self.tree_model)
  216.             tree_view.expand_all()
  217.             tree_view.grab_focus()
  218.             self.update_device_notebook(self.virtual_root.children[0])
  219.             return None
  220.  
  221.     
  222.     def udi_to_device(self, device_udi):
  223.         '''Given a HAL UDI (Unique Device Identifier) this method returns
  224.         the corresponding HAL device'''
  225.         return self.virtual_root.find_by_udi(device_udi)
  226.  
  227.     
  228.     def build_device_tree(self):
  229.         '''Retrieves the device list from the HAL daemon and builds
  230.         a tree of Device (Python) objects. The root is a virtual
  231.         device'''
  232.         device_names = self.hal_manager.GetAllDevices()
  233.         device_names.sort()
  234.         virtual_root = Device('virtual_root', None, { })
  235.         self.device_list = [
  236.             virtual_root]
  237.         for name in device_names:
  238.             device_dbus_obj = self.bus.get_object('org.freedesktop.Hal', name)
  239.             properties = device_dbus_obj.GetAllProperties(dbus_interface = 'org.freedesktop.Hal.Device')
  240.             
  241.             try:
  242.                 parent_name = properties['info.parent']
  243.             except KeyError:
  244.                 parent_name = '/'
  245.             except TypeError:
  246.                 print 'Error: no properties for device %s' % name
  247.                 continue
  248.  
  249.             device = Device(name, parent_name, properties)
  250.             self.device_list.append(device)
  251.         
  252.         for device in self.device_list:
  253.             parent_name = device.parent_name
  254.             device.parent_device = virtual_root
  255.             if parent_name != '/':
  256.                 for p in self.device_list:
  257.                     if p.device_name == parent_name:
  258.                         device.parent_device = p
  259.                         p.children.append(device)
  260.                         continue
  261.                 
  262.             
  263.             if device != virtual_root and device.parent_device == virtual_root:
  264.                 virtual_root.children.append(device)
  265.             
  266.             if device == virtual_root:
  267.                 device.parent_device = None
  268.                 continue
  269.         
  270.         return virtual_root
  271.  
  272.     
  273.     def update_tab_device(self, device):
  274.         """Updates the 'Device' tab given a Device object"""
  275.         bus = self.xml.get_widget('ns_device_bus')
  276.         vendor = self.xml.get_widget('ns_device_vendor')
  277.         product = self.xml.get_widget('ns_device_name')
  278.         category = self.xml.get_widget('ns_device_category')
  279.         capabilities = self.xml.get_widget('ns_device_capabilities')
  280.         product.set_label('Unknown')
  281.         vendor.set_label('Unknown')
  282.         bus.set_label('Unknown')
  283.         d = device
  284.         while d:
  285.             if d.properties.has_key('info.subsystem'):
  286.                 bus.set_label(Const.BUS_NAMES[d.properties['info.subsystem']])
  287.                 break
  288.             
  289.             d = self.udi_to_device(d.properties['info.parent'])
  290.         if device.properties.has_key('info.subsystem') and device.properties['info.subsystem'] == 'usb':
  291.             if device.properties.has_key('info.product'):
  292.                 product.set_label('%s' % device.properties['info.product'])
  293.             elif device.properties.has_key('usb.product'):
  294.                 product.set_label('%s' % device.properties['usb.product'])
  295.             elif device.properties.has_key('usb.product_id'):
  296.                 product.set_label('Unknown (0x%x)' % device.properties['usb.product_id'])
  297.             else:
  298.                 product.set_label('Unknown')
  299.             if device.properties.has_key('info.vendor'):
  300.                 vendor.set_label('%s' % device.properties['info.vendor'])
  301.             elif device.properties.has_key('usb.vendor'):
  302.                 vendor.set_label('%s' % device.properties['usb.vendor'])
  303.             elif device.properties.has_key('usb.vendor_id'):
  304.                 vendor.set_label('Unknown (0x%x)' % device.properties['usb.vendor_id'])
  305.             else:
  306.                 vendor.set_label('Unknown')
  307.         elif device.properties.has_key('info.subsystem') and device.properties['info.subsystem'] == 'pci':
  308.             if device.properties.has_key('info.product'):
  309.                 product.set_label('%s' % device.properties['info.product'])
  310.             elif device.properties.has_key('pci.product'):
  311.                 product.set_label('%s' % device.properties['pci.product'])
  312.             elif device.properties.has_key('pci.product_id'):
  313.                 product.set_label('Unknown (0x%x)' % device.properties['pci.product_id'])
  314.             else:
  315.                 product.set_label('Unknown')
  316.             if device.properties.has_key('info.vendor'):
  317.                 vendor.set_label('%s' % device.properties['info.vendor'])
  318.             elif device.properties.has_key('pci.vendor'):
  319.                 vendor.set_label('%s' % device.properties['pci.vendor'])
  320.             elif device.properties.has_key('pci.vendor_id'):
  321.                 vendor.set_label('Unknown (0x%x)' % device.properties['pci.vendor_id'])
  322.             else:
  323.                 vendor.set_label('Unknown')
  324.         elif device.properties.has_key('info.subsystem') and device.properties['info.subsystem'] == 'block':
  325.             if device.properties.has_key('info.product'):
  326.                 product.set_label('%s' % device.properties['info.product'])
  327.             else:
  328.                 product.set_label('Unknown')
  329.             if device.properties.has_key('info.vendor'):
  330.                 vendor.set_label('%s' % device.properties['info.vendor'])
  331.             else:
  332.                 vendor.set_label('Unknown')
  333.         else:
  334.             product.set_label('Unknown')
  335.             vendor.set_label('Unknown')
  336.         if device.properties.has_key('info.category'):
  337.             category.set_label('"' + '", "'.join(device.properties['info.capabilities']) + '"')
  338.         else:
  339.             category.set_label('Unknown')
  340.         if device.properties.has_key('info.capabilities'):
  341.             capabilities.set_label(', '.join(device.properties['info.capabilities']))
  342.         else:
  343.             capabilities.set_label('Unknown')
  344.  
  345.     
  346.     def update_tab_usb(self, device):
  347.         """Updates the 'USB' tab given a Device object; may hide it"""
  348.         page = self.xml.get_widget('device_notebook').get_nth_page(1)
  349.         if not device.properties.has_key('info.subsystem') or device.properties['info.subsystem'] != 'usb':
  350.             page.hide_all()
  351.             return None
  352.         
  353.         page.show_all()
  354.         version = self.xml.get_widget('ns_usb_version')
  355.         bandwidth = self.xml.get_widget('ns_usb_bandwidth')
  356.         maxpower = self.xml.get_widget('ns_usb_maxpower')
  357.         man_id = self.xml.get_widget('ns_usb_man_id')
  358.         prod_id = self.xml.get_widget('ns_usb_prod_id')
  359.         revision = self.xml.get_widget('ns_usb_rev')
  360.         bcdVersion = device.properties['usb.version_bcd']
  361.         version.set_label('%x.%x' % (bcdVersion >> 8, bcdVersion & 255))
  362.         bcdSpeed = device.properties['usb.speed_bcd']
  363.         bandwidth.set_label('%x.%x Mbit/s' % (bcdSpeed >> 8, bcdSpeed & 255))
  364.         maxpower.set_label('%d mA' % device.properties['usb.max_power'])
  365.         if not device.properties.has_key('usb.vendor'):
  366.             man_id.set_label('0x%04x' % device.properties['usb.vendor_id'])
  367.         else:
  368.             man_id.set_label('%s' % device.properties['usb.vendor'])
  369.         if not device.properties.has_key('usb.product'):
  370.             prod_id.set_label('0x%04x' % device.properties['usb.product_id'])
  371.         else:
  372.             prod_id.set_label('%s' % device.properties['usb.product'])
  373.         bcdDevice = device.properties['usb.device_revision_bcd']
  374.         revision.set_label('%x.%x' % (bcdDevice >> 8, bcdDevice & 255))
  375.  
  376.     
  377.     def update_tab_pci(self, device):
  378.         """Updates the 'PCI' tab given a Device object; may hide it"""
  379.         page = self.xml.get_widget('device_notebook').get_nth_page(2)
  380.         if not device.properties.has_key('info.subsystem') or device.properties['info.subsystem'] != 'pci':
  381.             page.hide_all()
  382.             return None
  383.         
  384.         page.show_all()
  385.         man_id = self.xml.get_widget('ns_pci_man_id')
  386.         prod_id = self.xml.get_widget('ns_pci_prod_id')
  387.         subsys_man_id = self.xml.get_widget('ns_pci_subsys_man_id')
  388.         subsys_prod_id = self.xml.get_widget('ns_pci_subsys_prod_id')
  389.         if not device.properties.has_key('pci.vendor'):
  390.             man_id.set_label('Unknown (0x%04x)' % device.properties['pci.vendor_id'])
  391.         else:
  392.             man_id.set_label('%s' % device.properties['pci.vendor'])
  393.         if not device.properties.has_key('pci.product'):
  394.             prod_id.set_label('Unknown (0x%04x)' % device.properties['pci.product_id'])
  395.         else:
  396.             prod_id.set_label('%s' % device.properties['pci.product'])
  397.         if not device.properties.has_key('pci.subsys_vendor'):
  398.             subsys_man_id.set_label('Unknown (0x%04x)' % device.properties['pci.subsys_vendor_id'])
  399.         else:
  400.             subsys_man_id.set_label('%s' % device.properties['pci.subsys_vendor'])
  401.         if not device.properties.has_key('pci.subsys_product'):
  402.             subsys_prod_id.set_label('Unknown (0x%04x)' % device.properties['pci.subsys_product_id'])
  403.         else:
  404.             subsys_prod_id.set_label('%s' % device.properties['pci.subsys_product'])
  405.  
  406.     
  407.     def update_tab_advanced(self, device):
  408.         """Updates the 'Advanced' tab given a Device object"""
  409.         store = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_STRING)
  410.         keys = device.properties.keys()
  411.         keys.sort()
  412.         for p in keys:
  413.             iter = store.append()
  414.             val = device.properties[p]
  415.             ptype = type(val)
  416.             if issubclass(ptype, str):
  417.                 store.set(iter, 0, p, 1, 'string', 2, '%s' % val)
  418.                 continue
  419.             if issubclass(ptype, unicode):
  420.                 store.set(iter, 0, p, 1, 'string', 2, val.encode('utf-8'))
  421.                 continue
  422.             if issubclass(ptype, (bool, dbus.Boolean)):
  423.                 if val:
  424.                     store.set(iter, 0, p, 1, 'bool', 2, 'true')
  425.                 else:
  426.                     store.set(iter, 0, p, 1, 'bool', 2, 'false')
  427.             val
  428.             if issubclass(ptype, int):
  429.                 store.set(iter, 0, p, 1, 'int', 2, '%d (0x%x)' % (val, val))
  430.                 continue
  431.             if issubclass(ptype, long):
  432.                 store.set(iter, 0, p, 1, 'long', 2, '%d (0x%x)' % (val, val))
  433.                 continue
  434.             if issubclass(ptype, float):
  435.                 store.set(iter, 0, p, 1, 'float', 2, '%f' % val)
  436.                 continue
  437.             if ptype == list:
  438.                 store.set(iter, 0, p, 1, 'list', 2, ', '.join(val))
  439.                 continue
  440.             if issubclass(ptype, list):
  441.                 formatted = (u'"' + u'", "'.join(val) + u'"').encode('utf-8')
  442.                 store.set(iter, 0, p, 1, 'strlist', 2, formatted)
  443.                 continue
  444.             store.set(iter, 0, p, 1, '(unknown type)', 2, '')
  445.         
  446.         prop_tree_view = self.xml.get_widget('ns_adv_properties')
  447.         cols = prop_tree_view.get_columns()
  448.         for cr in cols:
  449.             prop_tree_view.remove_column(cr)
  450.         
  451.         cell_renderer = gtk.CellRendererText()
  452.         cell_renderer.set_property('editable', True)
  453.         column0 = gtk.TreeViewColumn('Key', cell_renderer, text = 0)
  454.         column1 = gtk.TreeViewColumn('Type', cell_renderer, text = 1)
  455.         column2 = gtk.TreeViewColumn('Value', cell_renderer, text = 2)
  456.         prop_tree_view.append_column(column0)
  457.         prop_tree_view.append_column(column1)
  458.         prop_tree_view.append_column(column2)
  459.         prop_tree_view.set_model(store)
  460.  
  461.     
  462.     def update_device_notebook(self, device):
  463.         '''Updates the entire notebook of tabs given a Device object'''
  464.         self.update_tab_device(device)
  465.         self.update_tab_advanced(device)
  466.         self.update_tab_usb(device)
  467.         self.update_tab_pci(device)
  468.  
  469.  
  470.